/**
 * 请求拦截
 * @param {Object} http
 */
import CryptoJS from '@/utils/crypto-js.js'
import {
	removeEmpty
} from '@/common/function/removeEmpty.js'
let sync = uni.getSystemInfoSync()
let obj = {
	idfa: '', // 广告标识
	// #ifdef APP-PLUS
	platform:sync.platform,// 平台
	// #endif
	// #ifdef H5
	platform:'mp',
	// #endif
	// #ifdef MP-WEIXIN
	platform:'applet',
	// #endif
	brand:sync.deviceBrand||'other',// 设备品牌
	version:sync.appWgtVersion,//应用资源（wgt）的版本名称。
	deviceid:CryptoJS.MD5(sync.deviceId).toString(),//设备 id 。由 uni-app 框架生成并存储，清空 Storage 会导致改变
	timestamp:Date.parse(new Date())/1000,
}

// 获取广告标识IDFA 需要勾选IDFA
// #ifdef APP-PLUS
if (sync.platform == 'ios') {
	plus.device.getInfo({ //需要勾选IDFA
		success: function(e) {
			obj.idfa = e.idfa;
		}
	});
} else {
	plus.device.getOAID({
		success: function(e) {
			obj.idfa = e.oaid;
		}
	});
}
// #endif

module.exports = (vm) => {
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		let user_token = uni.getStorageSync('user_token')
		let lnvite_code = uni.getStorageSync('lnvite_code');
		let sinObj = get_sign({
			...config.data,
			...config.params,
			...obj,
			user_token,
			lnvite_code,
			client_id:vm.globalData.client_id,
			siteid:vm.globalData.siteid,
			openid:vm.globalData.openid,
		},vm);
		config.data = {
			...sinObj
		}
		// 全局处理空的数据
		removeEmpty(config.data)
		if (config.method == 'POST') {
			config.header = {
				...config.header,
				'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
			}
		}
		// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
		// console.log(vm.$store.state);
		return config
	}, (config) => // 可使用async await 做异步操作
	Promise.reject(config))
}

//数据签名
const get_sign = function(obj,vm,callback){
	//生成key升序数组
	var arr = Object.keys(obj),str = '';
	arr.sort();
	var k = 0;
	for(var i in arr){
		if(obj[arr[i]] != undefined && obj[arr[i]] != null && obj[arr[i]] !== '' && arr[i] != 'sign'){
			if(k == 0){
				str += arr[i] +'='+ obj[arr[i]];
			}else{
				str += '&'+arr[i] +'='+ obj[arr[i]];
			}
			k++;
		}else{
			delete obj[arr[i]];
		}
	}
	var encrypted = CryptoJS.MD5(str + vm.globalData.apikey).toString().toUpperCase();
	obj.sign = encrypted;
	typeof callback == "function" && callback(obj);
	if(callback == 'uri'){
		str += '&sign='+encrypted;
		return str;
	}
	return obj;
}